/***********************************************************************************************//**
*\n  @file       spi_ctrl.h
*\n  @brief      SPI控制程序、编码、解码
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. SPI控制程序、编码、解码
*\n       
*\n -----------------------------------------------------------------------------------
*\n  版本:   	修改人:       修改日期:        	描述:
*\n  V0.01      项目组        2020.2.17          创建
*\n 
***************************************************************************************************/
#ifndef _SPI_841CF7CF_E2B5_41FB_A232_52E4EF23B8EC_
#define _SPI_841CF7CF_E2B5_41FB_A232_52E4EF23B8EC_

#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */


/**************************************************************************************************
* 头文件
***************************************************************************************************/
#define   SIZE_OF_SPI_FRAME_HEAD   (14)   ///< spi帧头长度

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#define   API    	 /*API接口标志*/

/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/
///< uds协议处理的回调函数
typedef int (*TCallback_UdsProcess)(uint8_t rxBuffer[], int iSize);


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/
// 延时时间： s秒 + ms毫秒
API void Msleep(unsigned long s,  unsigned long ms);

/*************************************************************************************//**
* 功能描述：
*   1.物理层/链路层接口
*****************************************************************************************/
API int SpiOpen (void);
API int SpiClose(void);
API int SpiLock  (void);
API int SpiUnlock(void);
API int SpiTransfer(uint8_t *pTxBuf, /*OUT*/ uint8_t *pRxBuf, int len);
API int SpiWrite(uint8_t *TxBuf, int len);
API int SpiRead (uint8_t *RxBuf, int len);


/*************************************************************************************//**
* 功能描述：
*   1.该部分解析spi网路层协议（ISO layer3 network）
*   2.接口包括3个交互流程的接口： 发送流程，接收流程， 交互/应答流程； 
*****************************************************************************************/

/*************************************************************************************//**
*\n 函数名称： Layer3WriteFrame()
*\n 功能描述：
*\n            网络层协议编码/发送
*\n            1. 对应用层数据编码,打包成网络层的数据帧
*\n            2. 调用物理层接口发送数据
*\n            
*\n 输入参数：
*\n            size_t TxBuffer : 发送数据(应用层数据)
*\n            size_t iSize    : 发送长度(bytes)
*\n 输出参数: 
*\n            
*\n 返 回 值: 
*\n           0 成功; -1 失败; -n     错误码   
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2020.3.16     创建
*****************************************************************************************/
API int Layer3WriteFrame(uint8_t txBuffer[], size_t iSize);

/*************************************************************************************//**
*\n 函数名称： Layer3ReadFrame()
*\n 功能描述：
*\n            网络层读取函数（fpga读取MCU的参数）,
*\n            1. 调用物理层接口读取数据;
*\n            2. 解码/校验,并取出有效数据(应用层数据)
*\n            
*\n 输入参数：
*\n            char RecvBuffer[]  : 接收buffer
*\n            size_t iBufferSize : 接收buffer的长度
*\n            size_t iSize       : 接收长度(应用层数据长度)
*\n 输出参数: 
*\n            char RecvBuffer[]  : 接收数据(应用层数据)
*\n            
*\n 返 回 值:  下一帧长度
*\n             0: 没有下一帧   
*\n            -n: 错误码   
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2020.3.16     创建
*****************************************************************************************/
API int Layer3ReadFrame(  uint8_t RecvBuffer[], size_t iBufferSize,  size_t iSize);

/*************************************************************************************//**
*\n 函数名称： Layer3RegisterUdsProcess()
*\n 功能描述：
*\n            注册回调函数；
*\n            1.接收到mcu主动发的数据后， 解析网络层数据，再调用回调函数；
*\n            
*\n 输入参数：
*\n            TCallback_UdsProcess pFunc  : 回调函数指针
*\n 输出参数: 
*\n            
*\n 返 回 值: 
*\n           0 成功; -1 失败; -n     错误码    
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2020.3.16     创建
*****************************************************************************************/
API int Layer3RegisterUdsProcess(TCallback_UdsProcess pFunc);


/*************************************************************************************//**
*\n 函数名称： Layer3Init()
*\n 功能描述：
*\n            初始化spi网络层
*\n 输入参数：
*\n            void  
*\n 输出参数: 
*\n            
*\n 返 回 值: 
*\n           0 成功; -1 失败; -n     错误码   
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2020.3.18     创建
*****************************************************************************************/
API int Layer3Init(void);


/*************************************************************************************//**
*\n 函数名称： Layer3Uninit()
*\n 功能描述：
*\n            反初始化spi网络层
*\n 输入参数：
*\n            void  
*\n 输出参数: 
*\n            
*\n 返 回 值: 
*\n           0 成功; -1 失败; -n     错误码   
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2020.3.18     创建
*****************************************************************************************/
API int Layer3Uninit(void);




#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _SPI_841CF7CF_E2B5_41FB_A232_52E4EF23B8EC_ */



